iT邦幫忙

2022 iThome 鐵人賽

DAY 22
2

除了密碼儲存之外,有時候我們也會需要儲存一些實體檔案。

今天我們來聊聊怎麼利用 Laravel 來儲存檔案。

要用程式建立檔案,我們可以利用內建的 Storage 類別

Storage::disk('local')->put('example.txt', 'Contents');

預設狀況下,程式產生的檔案都會放在 storage/app 資料夾下。這個資料夾底下的檔案是不會透過網路對外公開的。

如果希望產生的檔案對外公開的話,一般來說會將檔案放在 public 資料夾內。不過這樣的話,在建立檔案的階段,又要做一些特殊的設定,說實話有一些麻煩。

更簡單的做法,是做一個連接,將 public/storage 這個路徑連接到 storage/app/public 內,這樣我們就可以將檔案放在 storage/app/public 內,但是檔案也對外公開了。

要產生這個連接,相信各位讀者又猜到了,還是透過 artisan

./vendor/bin/sail artisan storage:link

這樣,我們就可以安心的生成檔案,並且網站的使用者也能簡單的存取這些內容了。

如果想要寫入圖片或影片之類的檔案,可以直接傳入 PHP 的 resource

Storage::put('file.jpg', $resource);

如果你希望不要儲存檔案到本地電腦內,而是傳到網路儲存的服務,比方說 AWS 的 S3 上,在 Laravel 要這麼做也很簡單

首先,我們先安裝對應的套件

./vendor/bin/sail composer require league/flysystem-aws-s3-v3 "^3.0"

接著,就可以透過 Storage 存取了

Storage::disk('s3')->put('example.txt', 'Contents');

S3 的設定已經預設寫在 config/filesystem.php 內,我們只需要在 .env 裡面加上對應的設置參數即可

's3' => [
	'driver' => 's3',
	'key' => env('AWS_ACCESS_KEY_ID'),
	'secret' => env('AWS_SECRET_ACCESS_KEY'),
	'region' => env('AWS_DEFAULT_REGION'),
	'bucket' => env('AWS_BUCKET'),
	'url' => env('AWS_URL'),
	'endpoint' => env('AWS_ENDPOINT'),
	'use_path_style_endpoint' => env('AWS_USE_PATH_STYLE_ENDPOINT', false),
	'throw' => false,
],

.env 預設參數如下

AWS_ACCESS_KEY_ID=
AWS_SECRET_ACCESS_KEY=
AWS_DEFAULT_REGION=us-east-1
AWS_BUCKET=
AWS_USE_PATH_STYLE_ENDPOINT=false

要讀取檔案也很直觀

$contents = Storage::get('file.jpg');

如果希望取得一些基礎的檔案資訊,也非常簡單

比方說,size() 可以取得檔案的大小

Storage::size('file.jpg');

lastModified() 可以取得檔案最後修改的時間

$time = Storage::lastModified('file.jpg');

用 Laravel 來處理檔案,是不是很直觀又很簡單呢?

有關檔案處理的部分,今天就先分享到這邊。我們明天見!


上一篇
Day 21:Laravel 9 的密碼處理:Hash::make()
下一篇
Day 23:Laravel 存取其他伺服器:Http Client
系列文
Laravel 9 漫遊,享受魔法般的極速網頁開發體驗30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言